package base.transporte;

import base.Util;

public class Velocimetro {
	int velocidadeMedia;
	long timeUltimaMedicao;
	boolean primeiraMedicao;
	int bytesAcumuladosPorSeg;

	public Velocimetro() {
		velocidadeMedia = 0;
		timeUltimaMedicao = System.currentTimeMillis();
		primeiraMedicao = true;
		bytesAcumuladosPorSeg = 0;
	}

	public int getVelocidadeBytesPorSeg() {
		if (System.currentTimeMillis() - timeUltimaMedicao > 1000) {
			long segundos = (System.currentTimeMillis() - timeUltimaMedicao) / 1000;
			if (segundos != 0) {
				int velocidadeAtual = (int) (bytesAcumuladosPorSeg / segundos);
				if (primeiraMedicao) {
					primeiraMedicao = false;
					velocidadeMedia = velocidadeAtual;
				} else {
					velocidadeMedia = (int) (velocidadeMedia * 0.9 + velocidadeAtual * 0.1);
				}

				bytesAcumuladosPorSeg = 0;
				timeUltimaMedicao = System.currentTimeMillis();
			}
		}
		return this.velocidadeMedia;
	}

	public String getVelocidadeFormatada() {
		return Util.formatFilesize(this.getVelocidadeBytesPorSeg()).concat("/s");
	}

	public void informarTransferencia(int numBytesEnviados) {
		bytesAcumuladosPorSeg += numBytesEnviados;
		if (System.currentTimeMillis() - timeUltimaMedicao > 1000) {
			long segundos = (System.currentTimeMillis() - timeUltimaMedicao) / 1000;
			if (segundos != 0) {
				int velocidadeAtual = (int) (bytesAcumuladosPorSeg / segundos);
				if (primeiraMedicao) {
					primeiraMedicao = false;
					velocidadeMedia = velocidadeAtual;
				} else {
					velocidadeMedia = (int) (velocidadeMedia * 0.9 + velocidadeAtual * 0.1);
				}

				bytesAcumuladosPorSeg = 0;
				timeUltimaMedicao = System.currentTimeMillis();
			}
			// System.out.println(this.getVelocidadeFormatada());
		}

	}
}
